package com.example.demo;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.model.ClassAnnotationAttributes;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * @author duanboyao
 * @classname CodeGenerator
 * @date 2025/8/6 15:23
 * @description 执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
 */
public class CodeGenerator {

    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:dm://数据库ip:5236?schema=D_TEST&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8", "D_TEST", "D_TEST_89")
                // 全局配置
                .globalConfig((scanner, builder) -> builder
                        .outputDir((System.getProperty("user.dir")+"/src/main/java"))
                        .disableOpenDir()   // 禁止打开输出目录（默认 true）
                        .dateType(DateType.ONLY_DATE)   // 设置时间类型对应策略（默认值），数据库时间类型 到 实体类时间类型 对应策略
//                        .enableSwagger()    // 启用swagger
                        .commentDate(() -> new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
                        .author(scanner.apply("请输入作者名称？"))
                )

                // 包配置
                .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名？"))
                        .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir")+"/src/main/resources/mapper"))
                )
                // 策略配置
                .strategyConfig((scanner, builder) -> builder
                        .addTablePrefix("bdaosc") // 增加过滤表前缀，支持可变参数和List列表
                        .addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
                        // 实体策略
                        .entityBuilder()
                        .enableLombok(new ClassAnnotationAttributes("@Data","lombok.Data"))
                        .addTableFills(
                                new Column("create_time", FieldFill.INSERT)
                        )
                        .build())

                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}
